﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Studio7i.CapaDominio;

namespace Studio7i.CapaPersistencia.DAO
{
    public class AdministradorDAO: IAdministradorDAO
    {
        // Métodos CRUD
        public Administrador Crear(Administrador administradorACrear)
        {
            string _Sentencia = @"INSERT INTO Administrador values(@coAdministrador, @NoAdministrador, @TxMail, @FeNacimiento, @TxtClave)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@coAdministrador", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@NoAdministrador", administradorACrear.NoAdministrador));
                    _Comando.Parameters.Add(new SqlParameter("@TxMail", administradorACrear.TxMail));
                    _Comando.Parameters.Add(new SqlParameter("@FeNacimiento", administradorACrear.FeNacimiento));
                    _Comando.Parameters.Add(new SqlParameter("@TxtClave", administradorACrear.TxtClave));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }

        public Administrador Obtener(int codigo)
        {
            string _Sentencia = "SELECT CoAdministrador,NoAdministrador,TxMail,FeNacimiento, TxtClave FROM Administrador WHERE CoAdministrador=@coAdministrador";
            Administrador adminCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@coAdministrador", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            adminCreado = new Administrador();
                            adminCreado.CoAdministrador = _Resultado.GetInt32(0); ;
                            adminCreado.NoAdministrador = _Resultado.GetString(1);
                            adminCreado.TxMail = _Resultado.GetString(2);
                            adminCreado.FeNacimiento = _Resultado.GetString(3);
                            adminCreado.TxtClave = _Resultado.GetString(4);
                        }
                    }
                }
            }
            return adminCreado;
        }
        public Administrador Modificar(Administrador adminAModificar)
        {
            string _Sentencia = @"UPDATE Administrador SET NoAdministrador=@NoAdministrador, TxMail=@TxMail, FeNacimiento=@FeNacimiento, TxtClave=@TxtClave
                WHERE CoAdministrador=@coAdministrador";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@NoAdministrador", adminAModificar.NoAdministrador));
                    _Comando.Parameters.Add(new SqlParameter("@TxMail", adminAModificar.TxMail));
                    _Comando.Parameters.Add(new SqlParameter("@FeNacimiento", adminAModificar.FeNacimiento));
                    _Comando.Parameters.Add(new SqlParameter("@TxtClave", adminAModificar.TxtClave));
                    _Comando.Parameters.Add(new SqlParameter("@coAdministrador", adminAModificar.CoAdministrador));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(adminAModificar.CoAdministrador);
        }
        public void Eliminar(Administrador adminAEliminar)
        {
            string _Sentencia = "DELETE FROM administrador WHERE CoAdministrador=@coAdministrador";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@coAdministrador", adminAEliminar.CoAdministrador));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<Administrador> ListarTodos()
        {
            string _Sentencia = @"SELECT CoAdministrador, NoAdministrador, TxMail, FeNacimiento, TxtClave from administrador";
            ICollection<Administrador> administradorEncontradas = new List<Administrador>();
            Administrador administradorEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            administradorEncontrada = new Administrador();
                            administradorEncontrada.CoAdministrador = (int)_Resultado["CoAdministrador"];
                            administradorEncontrada.NoAdministrador = (string)_Resultado["NoAdministrador"];
                            administradorEncontrada.TxMail = (string)_Resultado["TxMail"];
                            administradorEncontrada.FeNacimiento = (String)_Resultado["FeNacimiento"];
                            administradorEncontrada.TxtClave = (string)_Resultado["TxtClave"];
                            administradorEncontradas.Add(administradorEncontrada);
                        }
                    }
                }
            }
            return administradorEncontradas;
        }
        public ICollection<Administrador> ListarXMailYClave(string TxMail, string TxtClave)
        {
            string _Sentencia = @"SELECT CoAdministrador, NoAdministrador, TxMail, FeNacimiento, TxtClave 
                FROM Administrador WHERE TxMail =@TxMail and TxtClave=@TxtClave";
            ICollection<Administrador> administradorEncontradas = new List<Administrador>();
            Administrador administradorEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@TxMail", TxMail));
                    _Comando.Parameters.Add(new SqlParameter("@TxtClave", TxtClave));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            administradorEncontrada = new Administrador();
                            administradorEncontrada.CoAdministrador = (int)_Resultado["CoAdministrador"];
                            administradorEncontrada.NoAdministrador = (String)_Resultado["NoAdministrador"];
                            administradorEncontrada.TxMail = (String)_Resultado["TxMail"];
                            administradorEncontrada.FeNacimiento = (String)_Resultado["FeNacimiento"];
                            administradorEncontrada.TxtClave = (String)_Resultado["TxtClave"];
                            administradorEncontradas.Add(administradorEncontrada);
                        }

                    }

                }
            }
            return administradorEncontradas;
        }

        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(CoAdministrador) FROM Administrador";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }

        public ICollection<Administrador> ListarXBusqueda(int? coAdministrador, string noAdministrador, string txEmail, string feNacimiento, string txClave)
        {
            string _Sentencia = @"SELECT CoAdministrador, NoAdministrador, TxMail, FeNacimiento, TxClave 
                FROM Administrador WHERE 1=1";
            ICollection<Administrador> adminsEncontrados = new List<Administrador>();
            Administrador adminEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (coAdministrador != null)
                    {
                        _Sentencia = _Sentencia + " AND CoCliente=@coAdministrador";
                        _Comando.Parameters.Add(new SqlParameter("@coAdministrador", coAdministrador));
                    }
                    if (noAdministrador != null)
                    {
                        _Sentencia = _Sentencia + " AND NoAdministrador LIKE '%'+@noAdministrador+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@noAdministrador", noAdministrador));
                    }
                    if (txEmail != null)
                    {
                        _Sentencia = _Sentencia + " AND TxMail LIKE '%'+@txEmail+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@txEmail", txEmail));
                    }
                    if (feNacimiento != null)
                    {
                        _Sentencia = _Sentencia + " AND FeNacimiento=@feNacimiento";
                        _Comando.Parameters.Add(new SqlParameter("@feNacimiento",feNacimiento));
                    }
                    if (txClave != null)
                    {
                        _Sentencia = _Sentencia + " AND TxClave LIKE '%'+@txClave+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@txClave", txClave));
                    }
                    _Comando.CommandText = _Sentencia;
                    _Comando.Connection = _Conexion;
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            adminEncontrado = new Administrador();
                            adminEncontrado.CoAdministrador= _Resultado.GetInt32(0); ;
                            adminEncontrado.NoAdministrador = _Resultado.GetString(1);
                            adminEncontrado.TxMail = _Resultado.GetString(2);
                            adminEncontrado.FeNacimiento = _Resultado.GetString(3);
                            adminEncontrado.TxtClave = _Resultado.GetString(4);
                            adminsEncontrados.Add(adminEncontrado);
                        }
                    }
                }
            }
            return adminsEncontrados;
        }

    }
}
